// 题目链接：https://www.luogu.com.cn/problem/P10448

#include <iostream>

using namespace std;

const int M = 50;

int n, m;
int q[M];

// start表示从start这个数开始选，pos表示现在在选第pos个数
void DFS(int start, int pos)
{
    // 剪枝，如果剩余的可选数的个数小于需要选的数的个数，则直接返回
    if (n - start + 1 < m - pos + 1)
    {
        return;
    }

    if (pos > m)
    { // 如果已经选出了m个数，则依次打印出这m个数，然后直接返回
        for (int i = 1; i <= m; ++i)
        {
            printf("%d ", q[i]);
        }
        printf("\n");

        return;
    }

    for (int i = start; i <= n; ++i)
    {                        //
        q[pos] = i;          //  选择i作为第pos个数
        DFS(i + 1, pos + 1); // 从i+1继续选择下一个位置的数

        // 恢复环境
        q[pos] = 0;
    }
}

int main()
{
    scanf("%d %d", &n, &m);
    DFS(1, 1);

    return 0;
}